## Contents

*   [1 Стандарты для создания пакетов Arch](#.D0.A1.D1.82.D0.B0.D0.BD.D0.B4.D0.B0.D1.80.D1.82.D1.8B_.D0.B4.D0.BB.D1.8F_.D1.81.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2_Arch)
    *   [1.1 Шаблон PKGBUILD](#.D0.A8.D0.B0.D0.B1.D0.BB.D0.BE.D0.BD_PKGBUILD)
    *   [1.2 Железные правила создания пакетов](#.D0.96.D0.B5.D0.BB.D0.B5.D0.B7.D0.BD.D1.8B.D0.B5_.D0.BF.D1.80.D0.B0.D0.B2.D0.B8.D0.BB.D0.B0_.D1.81.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2)
*   [2 Названия пакетов](#.D0.9D.D0.B0.D0.B7.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2)
    *   [2.1 Каталоги](#.D0.9A.D0.B0.D1.82.D0.B0.D0.BB.D0.BE.D0.B3.D0.B8)
    *   [2.2 Обязанности makepkg](#.D0.9E.D0.B1.D1.8F.D0.B7.D0.B0.D0.BD.D0.BD.D0.BE.D1.81.D1.82.D0.B8_makepkg)
    *   [2.3 Лицензия](#.D0.9B.D0.B8.D1.86.D0.B5.D0.BD.D0.B7.D0.B8.D1.8F)
    *   [2.4 Загрузка пакетов](#.D0.97.D0.B0.D0.B3.D1.80.D1.83.D0.B7.D0.BA.D0.B0_.D0.BF.D0.B0.D0.BA.D0.B5.D1.82.D0.BE.D0.B2)
*   [3 Дополнительные руководства](#.D0.94.D0.BE.D0.BF.D0.BE.D0.BB.D0.BD.D0.B8.D1.82.D0.B5.D0.BB.D1.8C.D0.BD.D1.8B.D0.B5_.D1.80.D1.83.D0.BA.D0.BE.D0.B2.D0.BE.D0.B4.D1.81.D1.82.D0.B2.D0.B0)

## Стандарты для создания пакетов Arch

Когда создаете пакет для Arch Linux, вы **должны придерживаться стандарта по созданию пакетов Arch**, который приведен ниже. Особенно если вы хотите **добавить** ваш пакет в Arch Linux.

### Шаблон PKGBUILD

```
# Contributor: Ваше Имя <email собака domain точка com>

pkgname=NAME
pkgver=VERSION
pkgrel=1
pkgdesc=""
arch=('i686' 'x86_64')
url="http://ADDRESS/"
license=('GPL')
groups=()
depends=()
makedepends=()
optdepends=()
provides=()
conflicts=()
replaces=()
backup=()
options=()
install=
source=($pkgname-$pkgver.tar.gz)
noextract=()
md5sums=() #generate with 'makepkg -g'

build() {
  cd $srcdir/$pkgname-$pkgver
  ./configure --prefix=/usr
  make || return 1
  make DESTDIR=$pkgdir install || return 1
}

```

### Железные правила создания пакетов

*   Пакет никогда не должен инсталироваться в /usr/local

*   **Не добавляйте своих переменных** в ваши сборочные скрипты, возможны **конфликты** с переменными, используемыми в makepkg. Если невозможно этого не делать, **используйте подчёркивание как префикс** (`_`). Пример: `_customvariable=` 

AUR не может определить использование ваших переменных и поэтому не может их использовать в заменах. Это часто можно наблюдать в ссылках на исходные тексты. Пример:

 `http://downloads.sourceforge.net/sourceforge/directxwine/$patchname.$patchver.diff.bz2` 

Этот недостаток сильно снижает функциональность AUR.

*   **Избегайте** использования `/usr/libexec/`. Используйте вместо этого `/usr/lib/${pkgname}/`

*   Поле `packager` из метафайла может быть **изменено** сборщиком с помощью соответствующей опции в файле `/etc/makepkg.conf`. Другой вариант - экспортировать переменную `PACKAGER` перед сборкой пакета с помощью `makepkg`:

 `# export PACKAGER="John Doe@your.email"` 

*   Все важные сообщения должны печататься в течении инсталяции. Для этого используется **файл .install**. Например, если пакету нужна дополнительная настройка, инструкции должны быть в этом файле.

*   Любые **опциональные зависимости**, которые не нужны для использования основной функциональности пакета не должны включаться в массив depends, но должны быть в массиве optdepends. В этом случае они будут напечатаны при инсталяции. Например:

```
 optdepends=('cups: printing support'
             'sane: scanners support'
             'libgphoto2: digital cameras support'
             'alsa-lib: sound support'
             'giflib: GIF images support'
             'libjpeg: JPEG images support'
             'libpng: PNG images support')

```

*   Не пишите **в описании пакета** имя самого пакета. Например, вместо "Nedit - это текстовый редактор для X11" лучше написать "Текстовый редактор для X11". Также постарайтесь, чтобы описание не было длинее ~80 символов.

*   Постарайтесь, чтобы **длина строки** в PKGBUILD не превышала ~100 символов.

*   **Не делайте пустых строк** в `PKGBUILD`

*   Общая практика - **сохранять порядок следования полей** в `PKGBUILD`, как показано выше. Однако, это не требование, только рекомендация в контексте **корректного синтаксиса bash**.

*   Не используйте в PKGBUILD символов национальных алфавитов. **Только ASCII** (Латинские буквы, цифры и знаки препинания)

## Названия пакетов

*   Имя пакета должно состоять **только из латинских букв и цифр**; все буквы должны быть **в нижнем регистре**.

*   Версия пакета **должна совпадать с версией автора**. Версии могут включать латинские буквы если это необходимо (например версия пакета nmap = 2.54BETA32). **Версия не должна содержать знак переноса!** Только латинские буквы, цифры и точку.

*   Релиз пакета **специфичен для пакетов Arch**. Он позволяет пользователю отличать старую сборку пакета от более новой, даже если версия пакета одна и таже. Когда обновляется версия пакета, **релиз пакета нужно сделать равным 1**. Затем по мере улучшения/исправления пакета, очередная сборка пакета **выкладывается со значением релиза, увеличенным на единицу**. Когда выходит новая версия, счетчик релизов сбрасывается в единицу. Релиз пакета должен соответствовать **тем же правилам, что и версия пакета**.

### Каталоги

*   **Файлы конфигурации** должны размещаться в каталоге `/etc`. Если таких файлов более одного можно **использовать подкаталог** чтобы не забивать `/etc`. Используйте имя `/etc/{pkgname}/` для подкаталога, где `{pkgname}` это имя вашего пакета (или разумная альтернатива, т.е. пакет apache использует `/etc/httpd/`).

*   Файлы пакета должны соответствовать требованиям, приведенным ниже.

**Общие правила для каталогов**:

| `/etc` | **Общесистемные** файлы настроек |
| `/usr/bin` | Исполняемые файлы |
| `/usr/sbin` | Исполняемые файлы для пользователя root |
| `/usr/lib` | Библиотеки |
| `/usr/include` | Заголовочные файлы для програм на C |
| `/usr/lib/{pkg}` | Модули, плагины, расширения и т.д. |
| `/usr/share/man` | man-страницы |
| `/usr/share/{pkg}` | Архитектурнонезависимые данные приложения |
| `/etc/{pkg}` | Файлы настроек пакета `{pkg}` |
| `/opt` | Огромные приложения "замкнутые в себе", такие как KDE, Mozilla, Gnome и т.д. |

*   Пакет не должен содержать нижепреведенных директорий:
    *   /dev
    *   /home
    *   /media
    *   /mnt
    *   /proc
    *   /root
    *   /selinux
    *   /sys
    *   /tmp
    *   /var/tmp

### Обязанности makepkg

Когда вы запускаете команду makepkg для сборки пакета, она делает следующие вещи автоматически:

1.  Проверяет установлены ли **зависимости**
2.  **Скачивает** исходные файлы из Интернета
3.  **Распаковывает** те архивы, которые может (tar.gz, tar.bz2, zip...)
4.  Вносит необходимые **исправления**
5.  **Собирает** программу и устанавливает ее в fake root
6.  **Удаляет** `/usr/doc`, `/usr/info`, `/usr/share/doc`, и `/usr/share/info` из пакета
7.  *Удаляет'* все символы из исполняемых файлов
8.  *Удаляет'* отладочные символы из библиотек
9.  Создает **метафайлы** пакета, которые впоследствии будут в него включены
10.  **Упаковывает** содержимое fake root в пакет
11.  **Сохраняет** пакет в указанном каталоге (по умолчанию в текущем каталоге)

### Лицензия

Пакет с лицензиями есть в репозитории current. Вы можете его использовать следующим образом:

*   Пакет current/licenses содержит некоторое количество частоиспользуемых лицензий в директории /usr/share/licenses/common. Например, /usr/share/licenses/common/GPL. Если ваш пакет имеет одну из этих лицензий, переменная licenses должна быть установлена в PKGBUILD, например, license=("GPL")

*   Если подходящей лицензии нет, можно сделать несколько вещей:

1.  Добавить в пакет директорию /usr/share/licenses/$pkgname/ с лицензией. Например /usr/share/licenses/dibfoo/COPYING.
2.  Если исходные тексты не содержат лицензии, скопируйте ее в сайта автора.
3.  Присвойте значение 'custom' переменной license. Также можно вместо 'custom' написать 'custom:"имя-лицензии"'.

*   Если лицензия используется более чем одним пакетом из официальных репозитариев и [community], она добавляется в папку common.

*   Лицензии MIT, BSD и Python - отдельный случай. Они не могут быть включены в пакет с общими лицензиями. Для переменной license - это выглядит как общие лицензии (license=("BSD"), license=("MIT") или license=("Python")), но со стороны файловой системы это custom лицензия, потому что каждый пакет имеет свою собственную строку с копирайтом. Каждый пакет с лицензиями MIT, BSD или Python должен содержать свою копию лицензии в /usr/share/licenses/$pkgname/.

*   Некоторые пакеты не могут использовать одну лицензию. В таких случаях переменная license содержит массив, т.е. license=("GPL" "custom:some commercial license"). Для большинства пакетов эти лицензии применяются в разных случаях использования пакета. Когда pacman получит возможность фильтровать пакеты по лицензии (т.е. вы сможете сказать "Я хочу использовать только программы, лицензированные под GPL или BSD") две и более лицензии скорее всего будут обрабатываться используя операцию ИЛИ, а не операцию И, т.е. pacman будет рассматривать приведенный пример как ПО под GPL, а не под какой-то другой лицензией.

### Загрузка пакетов

Перед загрузкой пакетов убедитесь, что:

*   Присутствует корректное поле `md5sum`, которое может быть сгенерировано при помощи `makepkg -g`.

*   Добавлен коментарий в первой строке `PKGBUILD` в таком формате:

 `# Contributor: Ваше Имя <ваш.e-mail>` 

*   Все **зависимости** поставлены корректно (например, запустите `ldd` на выполняемых файлах чтобы узнать от чего они зависят...).

Команда доверенных пользователей настоятельно рекомендует использовать программу `namcap`, написанную [Jason Chu](https://www.archlinux.org/fellows/#jason), для проверки ваших пакетов. `namcap` расскажет вам о неверных правах доступа, зависимостях и других общих ошибках. Вы можете установить `namcap` с помощью `pacman`.

Помните, что `namcap` может проверять не только собраные пакеты pkg.tar.gz, но и PKGBUILD'ы.

*   **Зависимости** - наиболее общая ошибка. Namcap может помочь в исправлении, но не всегда корректно. Проверьте зависимости еще раз, глядя в исходные тексты, документацию и на сайт автора.

*   **Не используйте <tt>replaces</tt>** в вашем PKGBUILD если только вы не хотите переименовать пакет. Например *Ethereal* переименовался в *Wireshark*. Если вы просто сделали альтернативную версию уже существующего пакета, используйте <tt>conflicts</tt> (и <tt>provides</tt> если этот пакет используется в зависимостях других пакетов). Главное отличие в том, что после синхронизации (-Sy) pacman заменить установленные пакеты, 'предлагая' пакеты с подходящими полями <tt>replaces</tt> во всех репозиториях; <tt>conflicts</tt> напротив, обрабатывается только непосредственно при установке пакета.

*   Все файлы загружаемые в AUR должны быть упакованы в **tar.gz**, который содержит каталог в **`PKGBUILD`** и **дополнительные файлы для сборки** (патчи, .install-файл, ...).

```
foo/PKGBUILD
foo/foo.install
foo/foo_bar.diff
foo/foo.rc.conf
```

Имя архива должно совпадать с именем пакета т.е. foo.tar.gz

Архив **не должен** содержать ни бинарный пакет, созданный makepkg, ни список файлов (filelist)

## Дополнительные руководства

Убедитесь, что прочитали это руководство. Важные моменты упомянутые здесь не будут повторены на нижеследующих страницах. Эти специальные стандарты разработаны как дополнение к этому документу.

**[Указания по созданию пакетов](/index.php/Creating_packages_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Creating packages (Русский)")**

* * *

[CLR](/index.php/CLR_package_guidelines "CLR package guidelines") – [Cross](/index.php/Cross-compiling_tools_package_guidelines "Cross-compiling tools package guidelines") – [Eclipse](/index.php/Eclipse_plugin_package_guidelines "Eclipse plugin package guidelines") – [Free Pascal](/index.php/Free_Pascal_package_guidelines "Free Pascal package guidelines") – [GNOME](/index.php/GNOME_package_guidelines "GNOME package guidelines") – [Go](/index.php/Go_package_guidelines "Go package guidelines") – [Haskell](/index.php/Haskell_package_guidelines "Haskell package guidelines") – [Java](/index.php/Java_package_guidelines "Java package guidelines") – [KDE](/index.php/KDE_package_guidelines "KDE package guidelines") – [Kernel](/index.php/Kernel_module_package_guidelines "Kernel module package guidelines") – [Lisp](/index.php/Lisp_package_guidelines "Lisp package guidelines") – [MinGW](/index.php/MinGW_package_guidelines "MinGW package guidelines") – [Nonfree](/index.php/Nonfree_applications_package_guidelines "Nonfree applications package guidelines") – [OCaml](/index.php/OCaml_package_guidelines "OCaml package guidelines") – [Perl](/index.php/Perl_package_guidelines "Perl package guidelines") – [PHP](/index.php/PHP_package_guidelines "PHP package guidelines") – [Python](/index.php/Python_package_guidelines "Python package guidelines") – [Ruby](/index.php/Ruby_Gem_package_guidelines "Ruby Gem package guidelines") – [VCS](/index.php/VCS_package_guidelines "VCS package guidelines") – [Web](/index.php/Web_application_package_guidelines "Web application package guidelines") – [Wine](/index.php/Wine_package_guidelines_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9) "Wine package guidelines (Русский)")